

public class TratadorDeLinhas extends Thread {

	private int linhaInicial;
	private int linhaFinal;
	private int numeroDeIteracoes;
	private Monitor monitor;
	private GerenciadorDeInformacoes gerenciador;

	public TratadorDeLinhas(int linhaInicial, int linhaFinal,
			int numeroDeIteracoes, GerenciadorDeInformacoes gerenciador,
			Monitor monitor) {
		super();
		this.gerenciador = gerenciador;
		this.linhaFinal = linhaFinal;
		this.linhaInicial = linhaInicial;
		this.monitor = monitor;
		this.numeroDeIteracoes = numeroDeIteracoes;
	}

	@Override
	public void run() {
		for (int iteracoes = 0; iteracoes < this.numeroDeIteracoes; iteracoes++) {
			this.monitor.queroDormir();
			for (int i = this.linhaInicial; i <= this.linhaFinal; i++) {
				for (int j = 1; j < this.gerenciador.getTabuleiroAtual()[0].length - 1; j++) {

					// Copia o valor antigo no tabulerio novo
					this.gerenciador.getTabuleiroPosterior()[i][j] = this.gerenciador
							.getTabuleiroAtual()[i][j];

					// Verifica se a formiga esta proxima
					int dy1 = Math.abs(i
							- this.gerenciador.getFormigaAtomicaY());
					int dx1 = Math.abs(j
							- this.gerenciador.getFormigaAtomicaX());
					int dy2 = this.gerenciador.getTabuleiroAtual().length - dy1
							- 2;
					int dx2 = this.gerenciador.getTabuleiroAtual()[0].length
							- dx1 - 2;
					int dy = Math.min(dy1, dy2);
					int dx = Math.min(dx1, dx2);

					// Se a formiga esta proxima nao executa as regras do life.
					if (dy + dx <= 3) {
						continue;
					}

					// Conta o numero de vizinhos ligados
					int numeroDeVizinhosLigados = 0;
					numeroDeVizinhosLigados += this.gerenciador
							.getTabuleiroAtual()[i][j - 1];
					numeroDeVizinhosLigados += this.gerenciador
							.getTabuleiroAtual()[i - 1][j - 1];
					numeroDeVizinhosLigados += this.gerenciador
							.getTabuleiroAtual()[i - 1][j];
					numeroDeVizinhosLigados += this.gerenciador
							.getTabuleiroAtual()[i - 1][j + 1];
					numeroDeVizinhosLigados += this.gerenciador
							.getTabuleiroAtual()[i][j + 1];
					numeroDeVizinhosLigados += this.gerenciador
							.getTabuleiroAtual()[i + 1][j + 1];
					numeroDeVizinhosLigados += this.gerenciador
							.getTabuleiroAtual()[i + 1][j];
					numeroDeVizinhosLigados += this.gerenciador
							.getTabuleiroAtual()[i + 1][j - 1];

					// Morte
					if (numeroDeVizinhosLigados < 2
							|| numeroDeVizinhosLigados > 3) {
						this.gerenciador.getTabuleiroPosterior()[i][j] = 0;
					} else if (numeroDeVizinhosLigados == 3) { // Nascimento
						this.gerenciador.getTabuleiroPosterior()[i][j] = 1;
					}
				}
			}
		}
		this.monitor.queroDormir();
	}
}
